Android MediaMetadataRetriever 从视频中截取某一帧图片

从视频中截取某一帧图片保存到本地

最近遇到一个问题,拍摄完视频后需要在视频中选择一帧当作视频封面

在Android中有这样一个类MediaMetadataRetriever

**官方API解释:MediaMetadataRetriever class provides a unified interface for retrieving frame and meta data from an input media file.
大概意思就是说:mediametadataretriever类提供了一个统一的接口用于从一个输入媒体文件中取得帧和元数据。**

对于官方的解释,这个类的用途我们大概已经知道了就是获取一个媒体文件的一些基本信息,比如视频文件或者音乐文件的总时长,或者视频文件的宽度和高度等基本信息

本文中使用的就是这个类MediaMetadataRetriever去从视频中获取某一帧

下面是效果图

下面是具体的代码实现

        mMetadataRetriever = new MediaMetadataRetriever();
        //mPath本地视频地址
        mMetadataRetriever.setDataSource(mPath);
        //这个时候就可以通过mMetadataRetriever来获取这个视频的一些视频信息了
        String duration = mMetadataRetriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION);//时长(毫秒)
        String width = mMetadataRetriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);//宽
        String height = mMetadataRetriever.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);//高
        //上面三行代码可以获取这个视频的宽高和播放总时长
        //下面这行代码才是关键,用来获取当前视频某一时刻(毫秒*1000)的一帧
        Bitmap bitmap = mMetadataRetriever.getFrameAtTime(mCovervideoview.getCurrentPosition()*1000, MediaMetadataRetriever.OPTION_CLOSEST);
        //这时就可以获取这个视频的某一帧的bitmap了

虽然效果出来了,但是还有一个不小的问题
在下面的seekbar拖动的时候上面的VideoView并不是平滑滑动的,而是从一个画面突然蹦到另一个画面
于是就查了一下VideoView的seekto方法,最后找到原因了。

在使用Android中的VideoView或者是MediaPlayer的seekto的时候,它定位的不是具体时刻的某一帧,而是离当前时刻最近的关键帧
所以在滑动的时候就会造成画面的不连续。要怎么使滑动的时候视频连续呢,是不是把视频的每一帧都变成关键帧,具体的思路和实现方法还在思考中……

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android,获取录制视频某张图片的方法如下: 1. 首先,使用MediaRecorder类录制视频MediaRecorder是一个API,允许我们在Android设备上录制视频。你可以使用它来设置视频的输出格式、编码器、帧率等参数,并调用start()方法开始录制。 2. 录制视频后,你需要在录制视频的过程获取视频的每一帧,并保存为图片。在每一帧保存为图片之前,你需要通过SurfaceHolder类来获取当前录制视频的画面。SurfaceHolder包含一个SurfaceView对象,你可以通过它来获取视频画面并进行操作。 3. 使用MediaMetadataRetriever类提取视频帧。它是一个用于检索和提取媒体文件元数据的类。你可以使用它来获取视频的每一帧,并将其保存为图片。 示例代码如下: ```java MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource("录制的视频文件路径"); Bitmap frame = retriever.getFrameAtTime(时间戳, MediaMetadataRetriever.OPTION_PREVIOUS_SYNC); //将frame保存为图片 ``` 上述代码,通过调用getFrameAtTime()方法,我们可以获取给定时间戳的视频帧。你可以根据自己的需求调整时间戳参数,或根据视频的帧率进行计算。 4. 最后,你可以将获取到的视频帧保存为图片,以便你之后进行操作或展示。你可以使用Bitmap类的compress()方法将Bitmap保存为图片文件,或直接在界面上展示这个Bitmap对象。 上述就是在Android获取录制视频某张图片的方法。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值